﻿#define  _CRT_SECURE_NO_WARNINGS  1
#include <stdio.h>
#include <string.h>
#include <assert.h>
//strcmp的使用和模拟实现
//int my_strcmp(const char* str1, const char* str2)
//{
//	assert(str1 && str2);
//	while (*str1 == *str2)
//	{
//		if (*str1 == '\0')
//			return 0;
//		str1++;
//		str2++;
//	}
//	if (*str1 > *str2)
//		return 1;
//	else
//		return -1;
//}
//int my_strcmp(const char* str1, const char* str2)
//{
//	assert(str1 && str2);
//	while (*str1 == *str2)
//	{
//		if (*str1 == '\0')
//			return 0;
//		str1++;
//		str2++;
//	}
//	return *str1 - *str2;
//}
//int main()
//{
//	char arr1[] = "abde";
//	char arr2[] = "abd";
//	int ret = my_strcmp(arr1, arr2);
//	//int ret=strcmp(arr1, arr2);
//	if (ret > 0)
//		printf("arr1>arr2\n");
//	else if (ret < 0)
//		printf("arr1<arr2\n");
//	else
//		printf("arr1=arr2\n");
//	return 0;
//}

//strncpy函数的使用和实现
//char* my_strncpy(char* dest, const char* src, size_t sz)//2
//{
//	assert(dest && src);
//	char* ret = dest;
//	for (int i = 0; i < sz; i++)
//	{
//		*dest = *src;
//		dest++;
//		src++;
//	}
//	return ret;
//}
//char* my_strncpy(char* dest, const char* src, size_t sz)//7
//{
//	assert(dest && src);
//	size_t len = strlen(src);
//	char* ret = dest;
//	if(sz<=len)
//	{
//		for (int i = 0; i < sz; i++)
//		{
//			*dest++ = *src++;
//		}
//	}
//	else
//	{
//		for (int i = 0; i < len; i++)//6
//		{
//			*dest= *src;
//			dest++;
//			src++;
//		}
//		for (int j = 0; j < sz - len; j++)//2
//		{
//			*dest = '\0';
//			dest++;
//		}
//	}
//	return ret;
//}
//int main()
//{
// 	char arr1[] = "abcdef";
//	char arr2[20] = "xxxxxxxxxxxx";
//	my_strncpy(arr2, arr1, 8);
	//strncpy(arr2, arr1, 2);
	//strncpy(arr2, arr1, 8);//超过拷贝的字符串，多出的部分用\0补充
//	printf("%s\n", arr2);
//	return 0;
//}

//char* my_strncat(char* dest, const char* src, size_t num)//2
//{
//	char* ret = dest;
//	while (*dest != '\0')
//		dest++;
//	for (int i = 0; i < num; i++)
//	{
//		*dest++ = *src;
//	}
//	*dest = '\0';//确保追加完成后放入一个\0
//	return ret;
//}
//int main()
//{
//	char arr1[20] = "abcdef\0yyyyyy";//从\0处追加，追加完成后还会放入一个\0
//	char arr2[] = "xxx";
//	my_strncat(arr1, arr2, 2);
//	//strncat(arr1, arr2,2);
//	//strncat(arr1, arr2, 5);//最多追加源头字符串个字符
//	printf("%s\n", arr1);
//	return 0;
//}

//int my_strcmp(const char* str1, const char* str2 , size_t num)
//{
//	assert(str1 && str2);
//	for (int i = 0; i < num; i++)
//	{
//		if (*str1 == *str2)
//		{
//			if(* str1 == '\0')
//			return 0;
//			str1++;
//			str2++;
//		}
//		else if (*str1 > *str2)
//			return 1;
//		else
//			return -1;
//	}
//}
//int main()
//{
//	char arr1[] = "acc";
//	char arr2[] = "abq";
//	int ret = my_strcmp(arr1, arr2, 2);
//	//int ret = 0;
//	//printf("%d", ret = strncmp(arr1, arr2, 2));
//	//int ret=strncmp(arr1, arr2, 2);
//	if (ret > 0)
//		printf("arr1>arr2\n");
//	else if (ret < 0)
//		printf("arr1<arr2\n");
//	else
//		printf("arr1=arr2\n");
//	return 0;
//}

//strstr函数的使用和模拟实现
//const char* my_strstr(const char* str1, const char* str2)
//{
//	assert(str1 && str2);
//	const char* s1 = str1;
//	const char* s2 = str2;
//	const char* cur = str1;//cur作为标记可能匹配成功的位置
//	if (*str2 == '\0')//如果str2是空字符串，直接返回str1
//		return str1;
//	while (*cur)
//	{
//		//完成匹配一次
//		s1 = cur;//让s1回到cur（可能匹配成功的）位置处
//		s2 = str2;//让s2回答str2位置处
//		while (*s1 && *s2 && *s1==*s2)
//		{
//			s1++;
//			s2++;
//		}
//		if (*s2 == '\0')
//			return cur;
//			cur++;
//	}
//	return NULL;
//}
//int main()
//{
//	char arr1[] = "abbcef";
//	char arr2[] = "bbc";
//	const char* ret = my_strstr(arr1, arr2);
//	//const char* ret=strstr(arr1, arr2);
//	if (ret == NULL)
//		printf("没找到\n");
//	else
//		printf("找到啦:%s\n", ret);
//	return 0;
//}

//strtok函数的使用
//int main()
//{
//	char arr1[] = "zpengwei@yeah.net";
//	char sep[] = "@.";
//	char buf[30] = { 0 };
//	strcpy(buf, arr1);
//	char* p = strtok(buf, sep);
//	printf("%s\n", p);
//	p = strtok(NULL, sep);
//	printf("%s\n", p);
//	p = strtok(NULL, sep);
//	printf("%s\n", p);
//	p = strtok(NULL, sep);
//	printf("%s\n", p);
//	return 0;
//}


//sep是分隔符
//int main()
//{
//	char arr1[] = "zpengwei@yeah.net";
//	char sep[] = "@.";
//	//char arr1[] = "192@168#110.123";
//	//	char sep[] = "@#.";
//	char buf[30] = { 0 };
//	strcpy(buf, arr1);
//	char* p = NULL;
//	for (p = strtok(buf, sep); p != NULL; p = strtok(NULL, sep))//strtok函数的第一个参数不为NULL,buf指向一个字符串arr1，arr1中
//		//包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记  函数将找到第一个标记zpengwei，strtok函数将保存zpengwei在字符串中的位置（说明函数内部有static修饰的变量）
//		// 第一次传参之后 找到第一个分隔符之前的第一个标记，然后将分隔符表示成\0
//		//strtok函数的第一个参数为NULL，函数将在同一个字符串中被保存的位置开始，查找下一个标记
//	{
//		printf("%s\n",p);
//	}
//	return 0;
//}

//strerror函数的使用
//int main()
//{
//	for (int i = 0; i < 10; i++)
//	{
//		printf("%d:%s\n", i, strerror(i));
//	}
//	return 0;
//}


//fopen 打开文件  fclose 关闭文件
//#include <errno.h>
//int main()
//{
//	//打开文件 -- 如果文件存在，就打开失败
//	FILE* pf = fopen("test.txt", "r");//r是读取test,txt文件
//	if (pf == NULL)
//	{
//		printf("文件打开失败，原因是:");
//		printf("%s\n", strerror(errno));//errno是全局变量 :需要头文件<errno.h> 将错误码翻译成错误信息
//		return 1;//错误返回
//	}
//	//打开成功了
//	//....
//	
//	//关闭文件
//	fclose(pf);
//	pf = NULL;//防止pf成为野指针
//
//	return 0;
//}

//perror  函数=strerror+printf
int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("文件打开失败，原因是");//perror函数打印完参数部分的字符串后，再打印⼀个冒号和⼀个空格，再打印错误信息。
		return 1;//错误返回
	}
	//打开成功了
	//....
	
	//关闭文件
	fclose(pf);
	pf = NULL;//防止pf成为野指针

	return;
}